#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
#include <stdbool.h>
#include <math.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <pwd.h>
#include <grp.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <signal.h>//信号
#include <pthread.h>//线程
#include <arpa/inet.h>//网络
#include <sys/socket.h>
#include <netdb.h>
#include <sys/epoll.h>
#include <sys/sendfile.h>
#include <mysql/mysql.h>
//检查命令行参数数量是否符合预期
#define ARGS_CHECK(argc, expected)\
    do{\
        if ((argc) != (expected)){\
            fprintf(stderr, "args num error!\n"); \
            exit(1); \
        }\
    }while(0)

// 检查返回值是否是错误标记,若是则打印msg和错误信息
#define ERROR_CHECK(ret, error_flag, msg) \
    do { \
        if ((ret) == (error_flag)) { \
            perror(msg); \
            exit(1); \
        } \
    } while (0)

// 将消息写入日志文件的宏函数
#define LOG_WRITE(info_num, information)\
    info_write(info_num, information);

typedef struct QueueNode{
    int data;
    struct QueueNode*next;
}QueueNode;
typedef struct QueueLink{
    QueueNode *head;
    QueueNode*tail;
    int size;

}QueueLink;
void tail_insert(QueueLink*q,int data);
int enqueue(QueueLink*q);
